﻿



package bonanza.math
{
	import flash.geom.Point;
	
	
	public class BezierCurve
	{
		// 스타트 포인트, 컨트롤 포인트, 앵커 포인트를 담고 있는 목록입니다.
		private var _pathList:Array;
		public function get pathList() :Array { return this._pathList; };
		public function set pathList( $pathList:Array ) :void 
		{ 
			this._pathList = $pathList; return; 
		};
		
		
		// 생성자 입니다.
		public function BezierCurve() 
		{ 
			return; 
		};


		// 소멸자 입니다.
		public function distory() :void
		{
			this._pathList = null;
			return;
		};
		
		
		// 커브의 시작점에서 목표지점까지의 이동 경로를 100% 라고 했을때 
		// 백분율 $startPercent에서 시작하여 백분율 $endPercent에 해당하는 구간의 
		// 모든 포인트객체를 배열상태로 계산하여 반환합니다. 
		public function getCurveList( $startPercent:uint = 0, $endPercent:uint = 100 ) :Array
		{
			var curvePathList:Array = [];
			var i :uint = $startPercent;
			while ( i <= $endPercent )
			{
				curvePathList[curvePathList.length] = this.getCurvePoint(i);
				++i;
			};
			return curvePathList
		};


		// 커브의 시작점에서 목표지점까지의 이동 경로를 100% 라고 했을때 
		// 특정 백분율 $time 퍼센트에 해당하는 지점의 포인트 객체를 반환합니다.
		public function getCurvePoint( $time:Number ) :Point
		{	
		
			/// 패치목록이 비어 있거나 시간비용이 0과 같거나 적거나, 100보다 크다면 트리거 중지후 널값 반환
			if( !this._pathList.length || $time < 0 || $time > 100 ){ return new Point };


			// 패치목록이 비어 있지 않다면 곡선 경로를 계산 합니다
			var point :Point  = new Point( 0, 0 );
			var time  :Number = $time * 0.01; 
			var n     :Number = ( 1 - time ); // 연산 횟수를 줄이기 위해 미리 계산 해놓는다.
			var len   :uint   = this._pathList.length - 1; // this._pathList는 포인트객체를 모아둔 배열입니다.		
			
			
			// 스타트 포인트 값 계산하기
			point.x = Math.pow( n, len ) * this._pathList[0].x;
			point.y = Math.pow( n, len ) * this._pathList[0].y;


			// 컨트롤 포인트 값 계산하기
			var i   :uint = 1;
			var cp  :Point;
			var tmp :Number;
			while ( i < len )
			{
				cp  = this._pathList[i];
				tmp = len * Math.pow( time, i ) * Math.pow( n, len - i );
				point.x +=  tmp * cp.x;
				point.y +=  tmp * cp.y;
				++i;
			};
			
			
			// 앵커 포인트 값 계산하기
			tmp = Math.pow( time, len );
			point.x +=  tmp * this._pathList[len].x;
			point.y +=  tmp * this._pathList[len].y;
			return point;
		};
	};
};